#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

#include <unistd.h>

extern char **environ;

// int execl(const char *pathname, const char *arg, ...
//           /*, (char *) NULL */);
// int execlp(const char *file, const char *arg, ...
//            /*, (char *) NULL */);
// int execle(const char *pathname, const char *arg, ...
//            /*, (char *) NULL, char *const envp[] */);
// int execv(const char *pathname, char *const argv[]);
// int execvp(const char *file, char *const argv[]);
// int execvpe(const char *file, char *const argv[], char *const envp[]);
int main()
{

    printf("hello\n");

    pid_t pid = vfork();

    if (pid == -1)
    {
        printf("创建进程失败 \n");
    }

    if (pid > 0)
    {
        printf("parent\n");
    }

    // 子进程
    if (pid == 0) // execl execlp execv 调用后不执行他后面的代码
    {

        // execl("./hello", "11", "22", "33", NULL); // pathname  不会使用全局命令 除非写全路径   全局命令 ls cat  只能在当前目录找

        // execlp("./hello", "11", NULL);  // file   如果路径没有/会当成全局的命令  ./hello hello   只能在全局里找
        // execlp("ls", "-l", NULL);   // 可以使用全局命令

        char *arr[] = {"11", "22", NULL};
        execv("./hello", arr); // 进程替换

        printf("child\n");
        exit(10); // 进程退出
    }

    return 0;
}

// 函数作用
// 在进程中加载新的程序，夏盖原有的代码，重新运行
// 参数
// pathname-》创建出子进程之后，你要让子进程执行哪个程序，将那个程序的路径+名字传递进来
// 比如创建出子进程之后，让他去执行另外一个程序“/hello"
// fie----》创建出子进程之后，你要让子进程执行哪个程序，将那个程序的名字传递进来（其实也可以传递路径+名字）
// arg---》执行程序时，需要的参数列表，以自身程序名字为开始，NULL作为结束标志
// 比如，你要执行./hello--》传递参数123--->"hello"123NULL
// 注意：只要进程被exec族替换掉之后，在exec函数之后的代码都不会执行了